package pe.com.bbva.mantenimiento.action;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

import pe.com.bbva.mantenimiento.bo.TablaBO;
import pe.com.bbva.mantenimiento.bo.TipoTarjetaBO;
import pe.com.bbva.mantenimiento.domain.Tabla;
import pe.com.bbva.mantenimiento.domain.TipoTarjeta;
import pe.com.bbva.seguridad.domain.Perfil;
import pe.com.bbva.seguridad.domain.Usuario;
import pe.com.bbva.util.Constantes;
import pe.com.stefanini.core.action.GenericAction;
import pe.com.stefanini.core.domain.UsuarioSession;
import pe.com.stefanini.core.exceptions.BOException;
import pe.com.stefanini.core.exceptions.DAOException;
import pe.com.stefanini.core.util.StringUtil;

@Service("codTarjetaAction")
@Scope("prototype")
@Results({
	@Result(name="viewFormCodTarjeta",type="tiles", location="viewFormCodTarjeta"),
	@Result(name="viewListCodTarjeta",type="tiles", location="viewListCodTarjeta"),
	@Result(name="listCodTarjeta",type="json",params={"root","grid"})
})
public class CodTarjetaAction extends GenericAction {
	private static final long serialVersionUID = 1L;
	private Logger logger = Logger.getLogger(this.getClass());
	@Resource
	private TablaBO tablaBO;
	@Resource
	private TipoTarjetaBO tipoTarjetaBO;
	
	private Long idTabla;
	private String codigoAntiguo;
	private Tabla tabla;
	private Tabla tablaBuscar;
	private Tabla tablaPadre;
	private String codigo;
	private String abreviado;
	private String descripcion;
	private String tipoTabla;
	
	private List<Tabla> listaTablas;

	public void cleanForm() {
		setIdTabla(null);
		setCodigoAntiguo("");
		setTabla(null);
		setTablaBuscar(null);
		setTablaPadre(null);
	}

	@Action(value="initCodTarjeta")
	public String init() {
		try {
			tablaBuscar = new Tabla();
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
		}
		return "viewListCodTarjeta";
	}
	
	@Action(value="findAllCodTarjeta")
	public String findAll() {
		try {
			if (tablaBuscar == null) {
				tablaBuscar = new Tabla();
			}
			tablaPadre = new Tabla();
			tablaPadre.setId(Constantes.ID_TABLA_COD_TARJETA);
			tablaBuscar.setPadre(tablaPadre);
			setGrid(tablaBO.findToGrid(tablaBuscar,getSidx()+" "+getSord(),getPage(),getRows()));
			if(getGrid().getRecords().equals(new Integer(0))){
				addActionError("No se encontraron resultados");
			}
		} catch (BOException e) {
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
		}
		return "listCodTarjeta";
	}
	
	@Action(value="newCodTarjeta")
	public String newForm() {
		return "viewFormCodTarjeta";
	}
	
	@Action(value="updateCodTarjeta")
	public String updateForm() {
		try {
			tabla = tablaBO.findTablaById(idTabla);
			if(tabla.getAbreviado() != null){
				if(tabla.getAbreviado().equals(Constantes.VAL_ACTIVO)){
					tabla.setAbreviado("true");
				}else{
					tabla.setAbreviado("false");
				}
			}
			codigoAntiguo = tabla.getCodigo();
		} catch (Exception e) {
			addActionError(e.getMessage());
			logger.error(StringUtil.getStackTrace(e));
		}
		return "viewFormCodTarjeta";
	}
	
	@Action(value="deleteCodTarjeta")
	public String delete() {
		try {
			String msjValidacion = validar(idTabla);
			if(msjValidacion==null){
				tablaBO.deleteLog(Tabla.class, idTabla);
				addActionMessage("Eliminado Correctamente.");
			}else{
				addActionError(msjValidacion);
			}
			if (tablaBuscar == null) {
				tablaBuscar = new Tabla();
			}
		} catch (BOException e) {
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
		}
		return "viewListCodTarjeta";
	}
	
	@Action(value="saveCodTarjeta")
	public String save() {
		String forward = "";
		String mensaje = "";
		if (idTabla == null) {
			mensaje = "Registrado Correctamente";
		} else {
			mensaje = "Actualizado Correctamente";
		}
		try {
			UsuarioSession usuarioSession = (UsuarioSession) getObjectSession(Constantes.USUARIO_SESSION);
			setCamposAuditoria(tabla, usuarioSession);
			tablaPadre = new Tabla();
			tablaPadre.setId(Constantes.ID_TABLA_COD_TARJETA);
			tabla.setPadre(tablaPadre);

			if(tabla.getAbreviado().equals("true")){
				tabla.setAbreviado(Constantes.VAL_ACTIVO);
			}else{
				tabla.setAbreviado(Constantes.VAL_INACTIVO);
			}
			String msjValidacion = null;
			if(tabla.getEstado().equals(Constantes.ESTADO_INACTIVO) && idTabla != null){
				msjValidacion = validar(idTabla);
			}
			if(msjValidacion==null){
				tablaBO.save(tabla,codigoAntiguo);
				addActionMessage(mensaje);
				cleanForm();
				forward = "viewListCodTarjeta";
			}else{
				addActionError(msjValidacion);
				forward = "viewFormCodTarjeta";
			}
		} catch (BOException e) {
			forward = "viewFormCodTarjeta";
			addActionError(e.getMessage());
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			forward = "viewFormCodTarjeta";
			addActionError(e.getMessage());
			logger.error(StringUtil.getStackTrace(e));
		}
		return forward;
	}
	
	private String validar(Long idTabla) throws BOException, DAOException {
		String msj = null; 
		Tabla codTarjeta = null;
		List<TipoTarjeta> listaTipoTarjeta = null;
		codTarjeta = tablaBO.findTablaById(idTabla);
		if(codTarjeta != null){
			TipoTarjeta tipoTarjeta = new TipoTarjeta();
			tipoTarjeta.setCodTarjeta(codTarjeta);
			tipoTarjeta.setEstado(Constantes.VAL_ACTIVO);
			listaTipoTarjeta = tipoTarjetaBO.findTipos(tipoTarjeta);
		}
		if(listaTipoTarjeta!= null && !listaTipoTarjeta.isEmpty()){
			msj = "No se puede eliminar Cod. de Tarjeta. Tiene Tipos de Tarjeta relacionados.";
		}
		return msj;
	}
	
	public List<Tabla> getListaTablas() {
		return listaTablas;
	}

	public void setListaTablas(List<Tabla> listaTablas) {
		this.listaTablas = listaTablas;
	}

	public Long getIdTabla() {
		return idTabla;
	}

	public void setIdTabla(Long idTabla) {
		this.idTabla = idTabla;
	}

	public String getCodigoAntiguo() {
		return codigoAntiguo;
	}

	public void setCodigoAntiguo(String codigoAntiguo) {
		this.codigoAntiguo = codigoAntiguo;
	}

	public Tabla getTablaBuscar() {
		return tablaBuscar;
	}

	public void setTablaBuscar(Tabla tablaBuscar) {
		this.tablaBuscar = tablaBuscar;
	}

	public Tabla getTabla() {
		return tabla;
	}

	public void setTabla(Tabla tabla) {
		this.tabla = tabla;
	}


	public String getCodigo() {
		return codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public String getAbreviado() {
		return abreviado;
	}

	public void setAbreviado(String abreviado) {
		this.abreviado = abreviado;
	}

	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public String getTipoTabla() {
		return tipoTabla;
	}

	public void setTipoTabla(String tipoTabla) {
		this.tipoTabla = tipoTabla;
	}

	public void setTablaPadre(Tabla tablaPadre) {
		this.tablaPadre = tablaPadre;
	}

	public Tabla getTablaPadre() {
		return tablaPadre;
	}
}